Для подробного ознакомления лучше прочитать MFC: "Шаг 332 - MFC и синхронизация", MSDN: "Шаг 82 - Что такое взаимоисключение (Mutex)", WinAPI: "Шаг 118 - Функции CreateMutex() и ReleaseMutex()".
В MFC для работы с Mutex есть соответствующий класс CMutex. Конструктор у этого класса всего один:
CMutex ( BOOL bInitiallyOwn = FALSE, // флаг владельца объекта LPCTSTR lpszName = NULL, // Имя объекта LPSECURITY_ATTRIBUTES lpsaAttribute = NULL // флаг защиты );
Давайте реализуем тот же прием, что в шаге API. Запретим запуск двух приложений. Для этого создаем приложение MFC AppWizard на базе диалогового окна с именем TestMutex.
Работать мы будем в классе приложения. Вот так он у Вас должен называться - CTestMutexApp. Первое это надо включить заголовочный файл класса CMutex:
...... #include "resource.h" // main symbols #include "afxmt.h" ////////////////////// // CTestMutexApp: ......
Для работы нам нужно два объекта классов. Мы их создадим. Сначало опишем:
......
class CTestMutexApp : public CWinApp
{
public:
CTestMutexApp();
CMutex* mutex;
CSingleLock* si;
// Overrides
.......
Потом проинициализируем:
CTestMutexApp::CTestMutexApp()
{
mutex = new CMutex(FALSE,"FirstStep",NULL);
si=new CSingleLock(mutex);
}
При окончании работы их нужно удалить:
int CTestMutexApp::ExitInstance()
{
delete si;
delete mutex;
return CWinApp::ExitInstance();
}
Все готово, чтобы написать основной код:
///////////////////////////////////
// CTestMutexApp initialization
BOOL CTestMutexApp::InitInstance()
{
if (!si->Lock(1))
{
AfxMessageBox("Error Running");
return FALSE;
}
AfxEnableControlContainer();
......
Все просто. Если нам удается заблокировать объект if (!si->Lock(1)), то программа запускается и объект блокируется. А вот если кто-то сделал это ранее, то мы прекращаем инициализацию программы сообщая пользователю. Первый экземпляр запускается без проблем. А вот второй не как, чего и требовалось.